package br.com.jmmarca.modelo.dao;

import java.util.ArrayList;
import java.util.List;

import br.com.jmmarca.modelo.entidade.Cidade;
import br.com.jmmarca.modelo.entidade.Grupo;
import br.com.jmmarca.modelo.generic.AbstractDAO;

public class GrupoDAO extends AbstractDAO<Grupo> {

    private static GrupoDAO instance;

    private GrupoDAO() {
        super(Grupo.class);
    }

    public static GrupoDAO getInstance() {
        if (instance == null) {
            instance = new GrupoDAO();
        }
        return instance;
    }

    public Grupo encontrarPorDescricaoESuperior(String descricao, Grupo superior) {
        try {
           List<Grupo> listGrupo = (List<Grupo>) getEntityManager().createQuery("Select c from Grupo c where c.descricao = upper(:descricao) and c.idSuperior = :superior").setParameter("descricao", descricao).setParameter("superior", superior.getId()).getResultList();
            if (listGrupo != null && !listGrupo.isEmpty()) {
                return listGrupo.get(0);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public Grupo encontrarGrupoPorDescricao(String descricao) {
        try {
            List<Grupo> listGrupo = (List<Grupo>) getEntityManager().createQuery("Select c from Grupo c where c.descricao = upper(:descricao) and c.idSuperior is null").setParameter("descricao", descricao).getResultList();
            if (listGrupo != null && !listGrupo.isEmpty()) {
                return listGrupo.get(0);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public Grupo encontrarSubgrupoPorDescricao(String descricao) {
        try {
            List<Grupo> listGrupo = (List<Grupo>) getEntityManager().createQuery("Select c from Grupo c where c.descricao = upper(:descricao) and c.idSuperior is not null").setParameter("descricao", descricao).getResultList();

            if (listGrupo != null && !listGrupo.isEmpty()) {
                return listGrupo.get(0);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public List<Grupo> listarSubGrupos() {
        try {
            List<Grupo> listGrupo = (List<Grupo>) getEntityManager().createQuery("Select c from Grupo c where c.idSuperior is not null order by c.id desc").getResultList();
            return listGrupo;

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return new ArrayList<Grupo>();
    }

    public List<Grupo> listarGrupos() {
        try {
            return (List<Grupo>) getEntityManager().createQuery("Select c from Grupo c where c.idSuperior is null").getResultList();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return new ArrayList<Grupo>();
    }

    public List<Grupo> listarSubGruposNaoFinalizados(Cidade cidade) {
        try {
            List<Grupo> listaSubgrupos = (List<Grupo>) getEntityManager().createQuery("Select g from Grupo g where (SELECT COUNT(p) FROM Parametro p WHERE p.grupo = g and p.nome = 'finalizado' and p.valor = 1 and p.cidade.id = :cidade) = 0 and g.idSuperior is not null")
            		.setParameter("cidade", cidade.getId())
            		.getResultList();
            return listaSubgrupos;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return new ArrayList<Grupo>();
    }
}
